package com.ftg.learn.common.utils;

import java.security.SecureRandom;
import java.util.Random;

public class VerificationCodeGenerator {
    // 默认字符集：数字+大小写字母
    private static final String DEFAULT_CHARSET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private static final Random RANDOM = new SecureRandom(); // 强随机数生成器

    /**
     * 生成默认六位数字+字母验证码
     */
    public static String generate() {
        return generate(6, DEFAULT_CHARSET);
    }

    /**
     * 生成指定长度的数字+字母验证码
     *
     * @param length 验证码长度（建议6-12位）
     */
    public static String generate(int length) {
        return generate(length, DEFAULT_CHARSET);
    }

    /**
     * 生成指定长度和字符集的验证码
     *
     * @param length  验证码长度
     * @param charset 字符集（如包含特殊字符需自行定义）
     */
    public static String generate(int length, String charset) {
        if (length <= 0 || charset == null || charset.isEmpty()) {
            throw new IllegalArgumentException("Invalid parameters: length=" + length + ", charset=" + charset);
        }

        StringBuilder code = new StringBuilder(length);
        int charsetLen = charset.length();

        for (int i = 0; i < length; i++) {
            // 生成[0, charsetLen-1]的随机索引
            int index = RANDOM.nextInt(charsetLen);
            code.append(charset.charAt(index));
        }

        return code.toString();
    }

    /**
     * 生成纯数字验证码
     */
    public static String generateNumericCode(int length) {
        return generate(length, "0123456789");
    }

    /**
     * 生成字母+数字验证码（区分大小写）
     */
    public static String generateAlphanumericCode(int length) {
        return generate(length, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
    }

    /**
     * 生成不区分大小写的字母+数字验证码
     */
    public static String generateCaseInsensitiveCode(int length) {
        return generate(length, "0123456789abcdefghijklmnopqrstuvwxyz").toUpperCase();
    }
}